package com.enjoyor.soa.traffic.util.helper;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.StringTokenizer;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPReply;

public class FtpHelper {

    /**
     * Description: 向FTP服务器上传文件
     * 
     * @Version 1.0
     * @param url
     *            FTP服务器hostname
     * @param port
     *            FTP服务器端口
     * @param username
     *            FTP登录账号
     * @param password
     *            FTP登录密码
     * @param path
     *            FTP服务器保存目录
     * @param filename
     *            上传到FTP服务器上的文件名
     * @param input
     *            输入流
     * @return 成功返回true，否则返回false
     */
    public static boolean uploadFile(String url, int port, String username, String password, String path,
            String filename, InputStream input) {
        boolean isSuccess = false;
        FTPClient ftp = new FTPClient();
        ftp.setBufferSize(4096); 
        ftp.setControlEncoding("UTF-8");
        FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
        conf.setServerLanguageCode("zh");

        try {
            int reply;
            ftp.connect(url, port); // 连接FTP服务器,如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器

            ftp.login(username, password); // 登录
            reply = ftp.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return isSuccess;
            }

            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

            // 这个方法不会改变当前工作目录 无法创建多级目录
            // ftp.makeDirectory(path);
            // 可以创建多层目录
            StringTokenizer s = new StringTokenizer(path, "/");
            s.countTokens();
            String pathName = "";
            while (s.hasMoreElements()) {
                pathName = pathName + "/" + (String) s.nextElement();
                try {
                    ftp.mkd(pathName);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            ftp.changeWorkingDirectory(path);
            ftp.storeFile(filename, input);
            input.close();
            ftp.logout();
            isSuccess = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return isSuccess;
    }

    /**
     * 将本地文件上传到FTP服务器上 *
     */

    /**
     * 
     * @Title: upLoadFromProduction @Description: TODO(将本地文件上传到FTP服务器上) @param
     *         url FTP服务器地址 @param port FTP服务器端口 @param username 用户名 @param
     *         password 密码 @param path FTP文件夹路径 @param filename 文件名 @param
     *         orginfilename 原始原件名 @return @throws
     */
    @SuppressWarnings("finally")
    public static boolean upLoadFromProduction(String url, int port, String username, String password, String path,
            String filename, String orginfilename) {
        boolean flag = false;
        try {
            FileInputStream in = new FileInputStream(new File(orginfilename));
            flag = uploadFile(url, port, username, password, path, filename, in);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return flag;
        }
    }
   
}
